package hxy.bytecode.thread.threadlocal;

public class ThreadLocalDemo {
    static class ThreadA implements Runnable {
        private ThreadLocal<String> threadLocal;

        public ThreadA(ThreadLocal<String> threadLocal) {
            this.threadLocal = threadLocal;
        }

        @Override
        public void run() {
            threadLocal.set("A");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }


            System.out.println("ThreadA " + threadLocal.get() + "\thashCode:" + threadLocal.hashCode());
        }
    }

    static class ThreadB implements Runnable {
        private ThreadLocal<String> threadLocal;

        public ThreadB(ThreadLocal<String> threadLocal) {
            this.threadLocal = threadLocal;
        }

        @Override
        public void run() {
            threadLocal.set("B");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            System.out.println("ThreadB " + threadLocal.get() + "\thashCode:" + threadLocal.hashCode());
        }
    }

    public static void main(String[] args) {
        ThreadLocal<String> threadLocal = new ThreadLocal<>();
        threadLocal.set("测试");
//        上面新建了一个实例，下面传入多个线程，但是每个线程都复制了一个副本
        new Thread(new ThreadA(threadLocal)).start();
        new Thread(new ThreadB(threadLocal)).start();
        new Thread(new ThreadB(threadLocal)).start();

        System.out.println(Thread.currentThread().getName() + threadLocal.get() + "\thashCode:" + threadLocal.hashCode());

    }

}